home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / DC_VIEW / CUTSUB.C next >
Text File  |  1995-03-20  |  11KB  |  418 lines

  1. #include <stdio.h>
  2. #include <iocslib.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. #include <event.h>        /* イベントマンを利用するときに必要    */
  7. #include <sxmemory.h>        /* メモリマンを利用するときに必要    */
  8. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  9. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  10. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  11. #include <task.h>        /* タスクマンを利用するときに必要    */
  12. #include "DC.h"
  13.  
  14. #define    BUF_X        128
  15. #define    BUF_Y        16
  16. #define    CUTMODE        1
  17. #define    TITLEMODE    2
  18.  
  19. typedef    unsigned char    BYTE2;
  20.  
  21. typedef    BYTE2    LINEBUF[ BUF_X ];
  22.  
  23. typedef    struct    {
  24.         short    dx, dy;
  25.         LINEBUF    buffer[ BUF_Y ];
  26.     } TEXTBUF;
  27.  
  28. typedef    BYTE2    CONDBUF[ 1 + BUF_X/8 + BUF_X ];
  29.  
  30. void    cutPrint();
  31. int    cutType();
  32. int    cutType2();    
  33.  
  34. int cut(ComVal *pcv, char *fileName)
  35. {
  36.     unsigned char    headder[49];
  37.     int    cutFile;
  38.     int    plane = 3;
  39.     int    x0, y0, x1, y1;
  40.     char ext[5];
  41.  
  42.     pcv->rc.d.left = 0;        /* FillImg レクタングル        */
  43.     pcv->rc.d.top = 0;
  44.     pcv->rc.d.bottom = 16;
  45.  
  46.     if (( cutFile = open( fileName, O_RDONLY | O_BINARY )) == -1 ) {
  47.         EMDeCross();
  48.         DMError(D_RED | D_CONFIRM, "cutsub.c\rファイルがオープンできません!" );
  49.         close( cutFile );
  50.         EMEnCross();
  51.         return(0);
  52.     } else {
  53.         read( cutFile, headder, 48 );
  54.         headder[48] = '\0';    /* ★ごみ防止 (89/04/14) */
  55.         if( headder[0] == 0 ) {
  56.             if (cutType2(pcv, plane, cutFile )) {    /* Title.sys */
  57.                 close( cutFile );
  58.                 return(0);
  59.             }
  60.         } else if( strncmp( headder, "CUT_V", 5 ) == 0 ) {
  61.             if(!cutType(pcv, plane, cutFile )) {    /* cut */
  62.                 close( cutFile );
  63.                 return(0);
  64.             }
  65.         } else {
  66.             EMDeCross();
  67.             DMError(D_RED | D_CONFIRM, "データが異常です!" );
  68.             close( cutFile );
  69.             EMEnCross();
  70.             return(0);
  71.         }
  72.     }
  73.     close( cutFile );
  74. /* printf("cut file No.%2d loaded!\n",pcv->cutNo);    */
  75.     pcv->cutNo++;
  76.     return(1);
  77. }
  78.  
  79.  
  80. int    cutType(pcv, plane, cutFile )    /* ★カットファイル表示 */
  81.     ComVal *pcv;
  82.     int    plane;
  83.     int    cutFile;
  84. {
  85.     short    dx, dy;
  86.     int    size, y;
  87.     TEXTBUF oneRegion;
  88.     CONDBUF    cond1, cond2;
  89.     BYTE2    *buffer;
  90.     int cut_no_buff;
  91.  
  92.     read( cutFile, &oneRegion, 4 );
  93.     dx = oneRegion.dx;
  94.     dy = oneRegion.dy;
  95.     pcv->rc.d.right = dx;
  96.     pcv->ymax = dy;
  97.     pcv->size = dx * dy;
  98.     pcv->x_size = dx;
  99.     pcv->y_size = dy;
  100.  
  101.     cut_no_buff = pcv->cutNo;
  102.     pcv->cutNo = 0;
  103.     if (offgraph(pcv) != TRUE)
  104.         return(FALSE);
  105.  
  106.     pcv->cutNo = cut_no_buff;
  107.     pcv->x_size = (dx * 3) / 4;
  108.     pcv->y_size = (dy * 3) / 4;
  109.  
  110.     if (offgraph(pcv) != TRUE)
  111.         return(FALSE);
  112.  
  113.     GMLockBits(pcv->bitsH[0]);    /* オフライングラフのビッツをロック    */
  114.     GMLockBits(pcv->bitsH[pcv->cutNo]);    /* オフライングラフのビッツをロック    */
  115.     GMSetGraph(&pcv->offgraph[0]); /* 描画をオフライン画面に対して行う     */
  116.     pcv->offgraph[0].bmap = &(*pcv->bitsH[0])->bmap;
  117.     GMAPage(G_ALLPAGE);        /* カレントグラフの初期設定    */
  118.     GMBackColor(G_BLACK);
  119.     GMForeColor(G_WHITE);
  120.  
  121.     size = ((( dx - 1 ) >> 3 ) + 1 );
  122.     y = 0;
  123.     buffer = &oneRegion.buffer;
  124.     expand2( buffer, 0, cond2 );
  125.     for( ; dy; dy-- ) {
  126.         read( cutFile, cond1, 1 );
  127.         read( cutFile, cond1+1, *cond1-1 );
  128.         expand1( cond2, size, cond1 );
  129.         expand2( buffer, size, cond2 );
  130.         buffer += size;
  131.         if( ++y == BUF_Y ) {
  132.             y = 0;
  133.             buffer = &oneRegion.buffer;
  134.             cutPrint(pcv, buffer );
  135.         }
  136.     }
  137.     if ( y != 0 ) {
  138.         buffer = &oneRegion.buffer;
  139.         cutPrint(pcv, buffer );
  140.     }
  141.     GMSetGraph(&pcv->offgraph[pcv->cutNo]); /* 描画をオフライン画面に対して行う     */
  142.     pcv->offgraph[pcv->cutNo].bmap = &(*pcv->bitsH[pcv->cutNo])->bmap;
  143.     GMCopy(&(*pcv->bitsH[0])->bmap, &(*pcv->bitsH[pcv->cutNo])->bmap,
  144.         &pcv->offgraph[0].rect, &pcv->offgraph[pcv->cutNo].rect,
  145.             G_PSET, NULL);
  146.     close( cutFile );
  147.     GMUnlockBits(pcv->bitsH[pcv->cutNo]);    /* オフライングラフのビッツをアンロック    */
  148.     GMUnlockBits(pcv->bitsH[0]);    /* オフライングラフのビッツをアンロック    */
  149.     if (pcv->bitsH[0] != NULL)
  150.         /* オフグラフ用のビッツハンドルを廃棄する */
  151.         GMDisposeBits(pcv->bitsH[0]);
  152.  
  153.     /* オフライングラフが作成されていたら */
  154.     if (pcv->offgraphOK[0]) {
  155.         /* ビットマップポインタだけヌルにして */
  156.         pcv->offgraph[0].bmap = NULL;
  157.         /* グラフをクローズする */
  158.         GMCloseGraph(&pcv->offgraph[0]);
  159.     }
  160.     return(TRUE);
  161. }
  162.  
  163. #define    H2_MAX    20
  164.  
  165. int    cutType2(pcv, plane, cutFile )    /* ★TITLE.SYSフォーマットデータ表示 */
  166.     ComVal *pcv;
  167.     int    plane;
  168.     int    cutFile;
  169. {
  170.     short    dx, dy;
  171.     int    size, y, amari;
  172.     TEXTBUF oneRegion;
  173.     BYTE2    *buffer;
  174.     unsigned char    headder2[H2_MAX];
  175.     int cut_no_buff;
  176.  
  177.     read( cutFile, headder2, H2_MAX );
  178.     dx = headder2[H2_MAX - 4];
  179.     dx = (dx << 8) + headder2[H2_MAX - 3];
  180.     dy = headder2[H2_MAX - 2];
  181.     dy = (dy << 8) + headder2[H2_MAX - 1];
  182.     if((dx <= 0) || (dy <= 0) || (dx > 1024) || (dy > 1024)) {
  183.         EMDeCross();
  184.         DMError(D_RED | D_CONFIRM, "cutsub.c\rデータが異常です!" );
  185.         EMEnCross();
  186.         return(1);
  187.     }
  188.     oneRegion.dx = dx;
  189.     oneRegion.dy = BUF_Y;
  190.     pcv->rc.d.right = dx;
  191.     pcv->ymax = dy;
  192.     pcv->size = dx * dy;
  193.     pcv->x_size = dx;
  194.     pcv->y_size = dy;
  195.  
  196.     cut_no_buff = pcv->cutNo;
  197.     pcv->cutNo = 0;
  198.     if (offgraph(pcv) != TRUE)
  199.         return(FALSE);
  200.  
  201.     pcv->cutNo = cut_no_buff;
  202.     pcv->x_size = (dx * 3) / 4;
  203.     pcv->y_size = (dy * 3) / 4;
  204.  
  205.     if (offgraph(pcv) != TRUE)
  206.         return;
  207.  
  208.     GMLockBits(pcv->bitsH[0]);    /* オフライングラフのビッツをロック    */
  209.     GMLockBits(pcv->bitsH[pcv->cutNo]);    /* オフライングラフのビッツをロック    */
  210.     GMSetGraph(&pcv->offgraph[0]); /* 描画をオフライン画面に対して行う     */
  211.     pcv->offgraph[0].bmap = &(*pcv->bitsH[0])->bmap;
  212.     GMAPage(G_ALLPAGE);        /* カレントグラフの初期設定    */
  213.     GMBackColor(G_BLACK);
  214.     GMForeColor(G_WHITE);
  215.  
  216.     if ((dx % 8) == 0) {
  217.         size = (dx >> 3) * BUF_Y;
  218.     } else {
  219.         size = ((dx >> 3) + 1) * BUF_Y;
  220.     }
  221.  
  222.     buffer = &oneRegion.buffer;
  223.     for(y = dy / BUF_Y; y > 0; y-- ) {
  224.         read( cutFile, buffer, size );
  225.         cutPrint(pcv, buffer );
  226.     }
  227.     if ((amari = dy % BUF_Y) != 0) {
  228.         size = ((((dx * amari)- 1 ) >> 3 ) + 1 );
  229.         read( cutFile, buffer, size );
  230.         cutPrint(pcv, buffer );
  231.     }
  232.     GMSetGraph(&pcv->offgraph[pcv->cutNo]); /* 描画をオフライン画面に対して行う     */
  233.     pcv->offgraph[pcv->cutNo].bmap = &(*pcv->bitsH[pcv->cutNo])->bmap;
  234.     GMCopy(&(*pcv->bitsH[0])->bmap, &(*pcv->bitsH[pcv->cutNo])->bmap,
  235.         &pcv->offgraph[0].rect, &pcv->offgraph[pcv->cutNo].rect,
  236.             G_PSET, NULL);
  237.     GMUnlockBits(pcv->bitsH[pcv->cutNo]);    /* オフライングラフのビッツをアンロック    */
  238.     GMUnlockBits(pcv->bitsH[pcv->cutNo]);    /* オフライングラフのビッツをアンロック    */
  239.     if (pcv->bitsH[0] != NULL)
  240.         /* オフグラフ用のビッツハンドルを廃棄する */
  241.         GMDisposeBits(pcv->bitsH[0]);
  242.  
  243.     /* オフライングラフが作成されていたら */
  244.     if (pcv->offgraphOK[0]) {
  245.         /* ビットマップポインタだけヌルにして */
  246.         pcv->offgraph[0].bmap = NULL;
  247.         /* グラフをクローズする */
  248.         GMCloseGraph(&pcv->offgraph[0]);
  249.     }
  250.     return(0);
  251. }    
  252.  
  253. void    cutPrint(pcv, buffer)
  254.     ComVal *pcv;
  255.     char *buffer;
  256. {
  257.     char **buffHdl;
  258.     char *pack1;
  259.     char *pack2;
  260.     long sizep,size;
  261.     int i,j,sw;
  262.  
  263.     sizep = pcv->rc.d.right;
  264.     pcv->ymax = pcv->ymax - 16;
  265.     if (pcv->ymax < 0)
  266.         pcv->rc.d.bottom = pcv->rc.d.bottom + pcv->ymax;
  267.  
  268.     sw = sizep % 16;
  269.     if ((sw && (sw < 9))) {
  270.         if ((sizep % 8)) {
  271.             sizep = (sizep / 8) + 2;
  272.         } else {
  273.             sizep = (sizep / 8) + 1;
  274.         }    
  275.             size = (sizep * 16) + 1024;
  276.             buffHdl = MMChHdlNew(size);
  277.             MMHdlLock(buffHdl);
  278.             pack1 = buffer;
  279.             pack2 = *buffHdl;
  280.             for (j=0;j<16;j++) {
  281.                 for (i=0;i<sizep-1;i++) {
  282.                     *pack2++ = *pack1++;
  283.                 }
  284.                 *pack2++ = 0;
  285.             }
  286.             GMFillImg(*buffHdl,&(pcv->rc));
  287.             MMHdlUnlock(buffHdl);
  288.             MMHdlDispose(buffHdl);
  289.     } else {
  290.         GMFillImg(buffer,&(pcv->rc));
  291.     }
  292.     pcv->rc.d.top = pcv->rc.d.top + 16;
  293.     pcv->rc.d.bottom = pcv->rc.d.bottom + 16;
  294. }
  295.  
  296. int    expand1( org, count, cond )
  297.     BYTE2    *org;
  298.     BYTE2    *cond;
  299.     int    count;
  300. {
  301.     int    pt, bt, flag,fgg = 0;
  302.     register BYTE2    *head, *body;
  303.     if ( *cond == 1 ) {
  304.         for( pt=0; pt < count; pt++ ) *org++=0;
  305.         return( count );
  306.     }
  307.     pt = (( count-1 ) >> 3 ) + 1;
  308.  
  309.     body = ( head = cond+1 ) + pt;
  310.     for( ; pt; pt-- ) {
  311.         flag = *head++;
  312.         for( bt=8; bt; bt-- ) {
  313.             if ( flag & 0x80 )  {
  314.                 *org = *body++;
  315.             } else    *org = 0;
  316.             org++;
  317.             flag <<= 1;
  318.         }
  319.     }
  320.  
  321.     return( count );
  322. }
  323.     
  324.  
  325. int    expand2( org, count, cond )
  326.     BYTE2    *org;
  327.     BYTE2    *cond;
  328.     int    count;
  329. {
  330.     static    LINEBUF    orgBuf;
  331.     register    c;
  332.     register BYTE2    *buf;
  333.     buf = orgBuf;
  334.     if ( count == 0 )
  335.         for( c=0; c<BUF_X; c++ )
  336.             *buf++ = 0;
  337.     else
  338.         for( c=0; c < count; c++ ) {
  339.             *org = *cond++ ^ *buf;
  340.             *buf++ = *org++;
  341.         }
  342.     return( count );
  343. }
  344.  
  345. /******************************************************************************
  346.  *    offgraph():    オフグラフの作成
  347.  ******************************************************************************
  348.  *    引数:    ComVal *pcv    共通変数へのポインタ
  349.  */
  350. int offgraph(ComVal *pcv)
  351. {
  352.     int ret;
  353.     Rect rc;
  354.  
  355.     rc.d.top = 0;
  356.     rc.d.left = 0;
  357.     rc.d.bottom = pcv->y_size;
  358.     rc.d.right = pcv->x_size;
  359.  
  360.     /* オフライングラフとワークのグラフをヌルクリアする */
  361.     memset(&pcv->offgraph[pcv->cutNo], 0, sizeof(Graph));
  362.  
  363.     /* オフライングラフ用ビッツを設定する(テキストモードにする) */
  364.     pcv->bitsH[pcv->cutNo] = GMNewBits(G_TXT, &rc, G_ALLPAGE);
  365.     if (pcv->bitsH[pcv->cutNo] == NULL) {
  366.         EMDeCross();
  367.         DMError(D_RED | D_CONFIRM, "cutsub.c\rメモリが確保できません。");
  368.         EMEnCross();
  369.         return FALSE;
  370.     }
  371.  
  372.     /* ビッツのビットイメージ領域をパレットNo.0でクリア */
  373.     memset((*pcv->bitsH[pcv->cutNo])->data, 0, (size_t)(*pcv->bitsH[pcv->cutNo])->size);
  374.  
  375.     /* オフライングラフ情報の作成 */
  376.     pcv->offgraph[pcv->cutNo].bmap = &(*pcv->bitsH[pcv->cutNo])->bmap;
  377.     ret = GMCalcGraph(&pcv->offgraph[pcv->cutNo]);
  378.     if (ret != 0) {
  379.         EMDeCross();
  380.         DMError(D_RED | D_CONFIRM, "cutsub.c\rグラフが作成できません。");
  381.         EMEnCross();
  382.         return FALSE;
  383.     }
  384.     /* オフライングラフ作成完了フラグオン */
  385.     pcv->offgraphOK[pcv->cutNo] = TRUE;
  386.     return TRUE;
  387. }
  388.  
  389. /******************************************************************************
  390.  *    dispoBits():    ビッツの解放
  391.  ******************************************************************************
  392.  *    引数:    ComVal *pcv    共通変数へのポインタ
  393.  */
  394. int dispoBits(ComVal *pcv)
  395. {
  396.     int ret;
  397.  
  398.     if (pcv->cutNo == 1)
  399.         return;
  400.  
  401.     for(ret=(pcv->cutNo-1);ret>0;ret--) {
  402.     
  403.         if (pcv->bitsH[ret] != NULL)
  404.             /* オフグラフ用のビッツハンドルを廃棄する */
  405.             GMDisposeBits(pcv->bitsH[ret]);
  406.  
  407.         /* オフライングラフが作成されていたら */
  408.         if (pcv->offgraphOK[ret]) {
  409.             /* ビットマップポインタだけヌルにして */
  410.             pcv->offgraph[ret].bmap = NULL;
  411.             /* グラフをクローズする */
  412.             GMCloseGraph(&pcv->offgraph[ret]);
  413.         }
  414.     }
  415.     pcv->cutNo = 1;
  416. }
  417. STR@)AEdEV3.00<@(!%G0JHH     
  418. S((SBxヨH vケ > >Ohh$000ヨ=4